Skip to content

feat(dashboard): show Lem version in dashboard modeline#2159

Open
theangelperalta wants to merge 3 commits intolem-project:mainfrom
theangelperalta:feat/dashboard-version-modeline
Open

feat(dashboard): show Lem version in dashboard modeline#2159
theangelperalta wants to merge 3 commits intolem-project:mainfrom
theangelperalta:feat/dashboard-version-modeline

Conversation

@theangelperalta
Copy link
Copy Markdown
Contributor

@theangelperalta theangelperalta commented May 1, 2026

Summary

Adds the Lem version number to the modeline while the dashboard buffer is active.

Changes

src/modeline.lisp

  • Adds modeline-version: a modeline element that reads the version from the ASDF system definition and renders it as v2.3.0.
  • Adds modeline-version-attribute / inactive-modeline-version-attribute with a subdued foreground so the version is visible but unobtrusive.

src/internal-packages.lisp

  • Exports the new symbols (modeline-version, modeline-version-attribute, inactive-modeline-version-attribute) plus the previously-missing modeline-major-mode and modeline-minor-modes from lem-core.

extensions/lem-dashboard/lem-dashboard.lisp

  • Sets a per-buffer modeline-format on the *dashboard* buffer inside redraw-dashboard, appending modeline-version on the right. This only affects the dashboard buffer; every other buffer keeps its default modeline format.

Testing

Compiled against lem/core with SBCL 2.5.10 — no errors (only pre-existing style warnings).

- Add modeline-version modeline element in src/modeline.lisp that
  displays the Lem version (e.g. ' v2.3.0 ') from the ASDF system
  definition, styled with a dim foreground attribute inspired by
  Doom Emacs.
- Export modeline-version, modeline-version-attribute,
  inactive-modeline-version-attribute, modeline-major-mode and
  modeline-minor-modes from lem-core in src/internal-packages.lisp.
- Apply a per-buffer modeline format for the *dashboard* buffer in
  lem-dashboard.lisp that appends modeline-version on the right side.
- Add a dashboard-version item class in dashboard-items.lisp that
  renders the version string centered below the splash art, matching
  the Doom Emacs start-screen style.
@code-contractor-app
Copy link
Copy Markdown
Contributor

code-contractor-app Bot commented May 1, 2026

✅ Code Contractor Validation: PASSED

=== Contract: contract ===

✓ Code Contractor Validation Result
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

📋 Contract Source: Repository

📊 Statistics:
  Files Changed:    5
  Lines Added:      39
  Lines Deleted:    1
  Total Changed:    40
  Delete Ratio:     0.03 (3%)

Status: PASSED ✅

🤖 AI Providers:
  - codex — model: gpt-5.4

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎉 No violations detected. Great job!
📋 Contract Configuration: contract (Source: Repository)
version: 2

trigger:
  paths:
    - "extensions/**"
    - "frontends/**/*.lisp"
    - "src/**"
    - "tests/**"
    - "contrib/**"
    - "**/*.asd"
  head_branches:
    exclude:
      - 'revert-*'

validation:
  limits:
    max_total_changed_lines: 400
    max_delete_ratio: 0.5
    max_files_changed: 10
    severity: warning

  ai:
    system_prompt: |
      You are a senior Common Lisp engineer reviewing code for Lem editor.
      Lem is a text editor with multiple frontends (ncurses, SDL2, webview).
      Focus on maintainability, consistency with existing code, and Lem-specific conventions.
    rules:
      # === File Structure ===
      - name: defpackage_rule
        prompt: |
          First form must be `defpackage` or `uiop:define-package`.
          Package name should match filename (e.g., `foo.lisp` → `:lem-ext/foo` or `:lem-foo`).
          Extensions must use `lem-` prefix (e.g., `:lem-python-mode`).

      - name: file_structure_rule
        prompt: |
          File organization (top to bottom):
          1. defpackage
          2. defvar/defparameter declarations
          3. Key bindings (define-key, define-keys)
          4. Class/struct definitions
          5. Functions and commands

      # === Style ===
      - name: loop_keywords_rule
        prompt: |
          Loop keywords must use colons: `(loop :for x :in list :do ...)`
          NOT: `(loop for x in list do ...)`

      - name: naming_conventions_rule
        prompt: |
          Naming conventions:
          - Functions/variables: kebab-case (e.g., `find-buffer`)
          - Special variables: *earmuffs* (e.g., `*global-keymap*`)
          - Constants: +plus-signs+ (e.g., `+default-tab-size+`)
          - Predicates: -p suffix for functions (e.g., `buffer-modified-p`)
          - Do NOT use -p suffix for user-configurable variables

      # === Documentation ===
      - name: docstring_rule
        prompt: |
          Required docstrings for:
          - Exported functions, methods, classes
          - `define-command` (explain what the command does)
          - Generic functions (`:documentation` option)
          Important functions should explain "why", not just "what".
        severity: warning

      # === Lem-Specific ===
      - name: internal_symbol_rule
        prompt: |
          Use exported symbols from `lem` or `lem-core` package.
          Avoid `lem::internal-symbol` access.
          If internal access is necessary, document why.

      - name: error_handling_rule
        prompt: |
          - `error`: Internal/programming errors
          - `editor-error`: User-facing errors (displayed in echo area)
          Always use `editor-error` for messages shown to users.

      - name: frontend_interface_rule
        prompt: |
          Frontend-specific code must use `lem-if:*` protocol.
          Do not call frontend implementation directly from core.
        severity: warning

      # === Functional Style ===
      - name: functional_style_rule
        prompt: |
          Prefer explicit function arguments over dynamic variables.
          Avoid using `defvar` for state passed between functions.
          Exception: Well-documented cases like `*current-buffer*`.

      - name: dynamic_symbol_call_rule
        prompt: |
          Avoid `uiop:symbol-call`. Rethink architecture instead.
          If unavoidable, document the reason.

      # === Libraries ===
      - name: alexandria_usage_rule
        prompt: |
          Alexandria utilities allowed: `if-let`, `when-let`, `with-gensyms`, etc.
          Avoid: `alexandria:curry` (use explicit lambdas)
          Avoid: `alexandria-2:*` functions not yet used in codebase

      # === Macros ===
      - name: macro_style_rule
        prompt: |
          Keep macros small. For complex logic, use `call-with-*` pattern:
          ```lisp
          (defmacro with-foo (() &body body)
            `(call-with-foo (lambda () ,@body)))
          ```
          Prefer `list` over backquote outside macros.
📚 About Code Contractor

Declarative Code Standards That Learn and Improve

Define domain-specific validation rules in YAML.
Your contracts document team knowledge and evolve into more accurate AI enforcement.

Want this for your repo?
Install Code Contractor

Copy link
Copy Markdown
Contributor

@code-contractor-app code-contractor-app Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Contractor validation passed ✅ — see the sticky comment for full results.

@theangelperalta theangelperalta changed the title feat(dashboard): show Lem version in dashboard modeline (Doom Emacs style) feat(dashboard): show Lem version in dashboard modeline May 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant